From 2fd44a3edc1918c5e0eeab2d695c9a0dd2d3f506 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 4 Aug 2016 10:08:00 +0200 Subject: [PATCH] x86/time: relax barriers On x86 there's no need for full barriers in loops waiting for some memory location to change. Nor do we need full barriers between two reads and two writes - SMP ones fully suffice. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/time.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index ca4e53b966..e64644031d 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -1211,7 +1211,7 @@ static void tsc_check_slave(void *unused) unsigned int cpu = smp_processor_id(); local_irq_disable(); while ( !cpumask_test_cpu(cpu, &tsc_check_cpumask) ) - mb(); + cpu_relax(); check_tsc_warp(cpu_khz, &tsc_max_warp); cpumask_clear_cpu(cpu, &tsc_check_cpumask); local_irq_enable(); @@ -1276,7 +1276,7 @@ static void time_calibration_tsc_rendezvous(void *_r) if ( smp_processor_id() == 0 ) { while ( atomic_read(&r->semaphore) != (total_cpus - 1) ) - mb(); + cpu_relax(); if ( r->master_stime == 0 ) { @@ -1289,21 +1289,21 @@ static void time_calibration_tsc_rendezvous(void *_r) write_tsc(r->master_tsc_stamp); while ( atomic_read(&r->semaphore) != (2*total_cpus - 1) ) - mb(); + cpu_relax(); atomic_set(&r->semaphore, 0); } else { atomic_inc(&r->semaphore); while ( atomic_read(&r->semaphore) < total_cpus ) - mb(); + cpu_relax(); if ( i == 0 ) write_tsc(r->master_tsc_stamp); atomic_inc(&r->semaphore); while ( atomic_read(&r->semaphore) > total_cpus ) - mb(); + cpu_relax(); } } @@ -1321,7 +1321,7 @@ static void time_calibration_std_rendezvous(void *_r) while ( atomic_read(&r->semaphore) != (total_cpus - 1) ) cpu_relax(); r->master_stime = read_platform_stime(); - mb(); /* write r->master_stime /then/ signal */ + smp_wmb(); /* write r->master_stime /then/ signal */ atomic_inc(&r->semaphore); } else @@ -1329,7 +1329,7 @@ static void time_calibration_std_rendezvous(void *_r) atomic_inc(&r->semaphore); while ( atomic_read(&r->semaphore) != total_cpus ) cpu_relax(); - mb(); /* receive signal /then/ read r->master_stime */ + smp_rmb(); /* receive signal /then/ read r->master_stime */ } time_calibration_rendezvous_tail(r); -- 2.30.2